import axios from 'axios'
import router from '@/router'
import store from '@/store'
import { Message } from 'element-ui'
import { getTimeOut } from '@/utils/auth'

/* 定义时间限制 */
const time = 3600

function isTimeOut() {
  var nowTime = Date.now() /* 当前时间戳 */
  var oldTime = getTimeOut() /* 存储的时间戳 */
  return (nowTime - oldTime) / 1000 > time/* 说明token超时,清空token */
}
// 创建一个axios实例
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, /* 定义请求前缀 */
  timeout: 5000 /* 定义超时时间 */
})

// 创建一个请求拦截器
service.interceptors.request.use(config => {
  /* 我们可以通过判断token是否存在来决定它是否需要携带token */
  if (store.getters.token) {
    if (isTimeOut()) {
      /* token超时,清空token */
      store.dispatch('user/logout')
      /* 跳转至登录页面 */
      router.push('/login')
      return Promise.reject(new Error('token超时了'))
    }
    /* 如果token存在,则添加请求头 */
    config.headers['Authorization'] = `Bearer ${store.getters.token}`
  }
  /* config 是请求配置信息,我们必须要将它返回出去,不然请求就无法发送成功  */
  return config
}, error => {
  console.log(error)
  return Promise.reject(error)
})

// 创建一个响应拦截器
service.interceptors.response.use(
  /* 设置两个参数,参数1响应成功的回调函数.参数2响应失败的回调函数 */
  response => {
    /* 解构响应数据 */
    const { success, message, data } = response.data
    /* 判断响应是否成功 */
    if (success) {
      /* 成功,返回响应数据 */
      return data
    } else {
      /* 失败,提示错误信息 */
      Message.error(message)
      return Promise.reject(message)
    }
  },

  error => {
    if (error.response && error.response.data && error.response.code === 10002) {
      /* 当服务器响应的是token超时的状态码10002时,我们清空token跳转至登录页 */
      store.dispatch('user/logout')

      router.push('/login')
    } else {
      Message.error(error.message) /* 提示错误信息 */
    }
    return Promise.reject(error.message) /* 返回错误信息
    注意: 我们收到的响应数据就是promise对象,所以我们通过拦截器返回的也应该是一个promise对象 */
  }
)

export default service
